package com.shujia

object Demo13Fun3 {


  def main(args: Array[String]): Unit = {


    /**
      *
      * 高阶函数
      *
      * 1、以函数作为参数
      * 2、以函数作为返回值
      *
      *
      * 面向对象编程  ----> 将对象传来传去
      * 面向函数编程   ---->  将函数传来传去
      *
      * 如果将一个函数作为参数的时候  ---> 需要考虑函数的类型
      *
      * 将函数可以看作是一个对象
      *
      * 函数的类型有参数类型和返回值类型决定
      *
      * def fun(i: Int): Int = i * i
      *
      * 这是一个参数为Int类型,返回值为Int类型的函数
      *
      */

    def fun(i: Int): Int = i * i


    //1、以函数作为参数
    /**
      * f: Int => Int   参数是一个函数， 需要一个参数为int返回值为int的函数
      *
      * =>  左边代表参数类型，右边代表返回值类型
      **/
    def fun2(f: Int => Int): Unit = {


      // f   相当于传进来的fun3 和fun4的一个引用

      //对传进来的函数进行调用
      val j: Int = f(10)

      println(j)

    }

    def fun3(i: Int): Int = i + 1

    def fun4(i: Int): Int = i * i

    ///调用fun2 闯入一个参数为Int返回值为int的函数
    fun2(fun3)
    fun2(fun4)


  }

}
